#include "saveairwv.h"

SaveAirWV::SaveAirWV(QObject *parent) : SaveBase(parent)
{

}

void SaveAirWV::onWorking(const QString ip, const quint16 port, const QByteArray arr)
{
    if(!m_saveStatues || arr.isEmpty() || ip != m_srcIP) return;

    // 检查是否已经超过1秒，计算帧率
//    if (m_fpsTimer.elapsed() >= 1000) {
//        m_currentFps = m_TimeCount * 1000.0 / m_fpsTimer.elapsed();
//        qDebug() << "存储端收到的帧率为:" << QString::number(m_currentFps / 256 + 1, 'f', 1) << "FPS";

//        // 重置计时器和计数器
//        m_fpsTimer.restart();
//        m_TimeCount = 0;
//    }

    //过滤通讯协议信号，使用的是和拍照数据同一个数据
    if(static_cast<quint8>(arr[0]) == 0x7E && static_cast<quint8>(arr[1] == 0x7E)) {
        return;
    }

    QByteArray payload = arr;

    //qDebug() << "payload.size" << payload.size();

    // 检查帧头是否为0x49 0x52 0x31 0x36
    if (payload.size() < 4 ||
        static_cast<quint8>(payload[0]) != 0x49 ||
        static_cast<quint8>(payload[1]) != 0x52 ||
        static_cast<quint8>(payload[2]) != 0x31 ||
        static_cast<quint8>(payload[3]) != 0x36) {
        qWarning() << "收到无效数据包，帧头不匹配";
        return;
    }

    // 检查数据包总大小是否为1312字节
    if (payload.size() != 1312) {
        qWarning() << "数据包大小错误，实际大小:" << payload.size() << "预期:1312";
        return;
    }

    // 解析照片帧号（4字节，小端模式）
    quint32 frameNumber = qFromLittleEndian<quint32>(reinterpret_cast<const uchar*>(payload.constData() + 4));

    // 解析切片帧号（4字节，小端模式）
    quint32 sliceNumber = qFromLittleEndian<quint32>(reinterpret_cast<const uchar*>(payload.constData() + 8));

    // 解析切片大小（4字节，小端模式）
    quint32 sliceSize = qFromLittleEndian<quint32>(reinterpret_cast<const uchar*>(payload.constData() + 12));


    QByteArray imageSlice = payload.mid(32, 1280);  // 从32字节偏移开始，提取1280字节图片数据

    if(sliceSize != imageSlice.size()) {
        qDebug() << "切片数据大小不足1280";
    }

    // 获取或创建当前帧的FrameData对象
    //AirFrameData &frame = m_airFrameMap[frameNumber];
    m_frame.frameNumber = frameNumber;

    //qDebug() << "SliceNumber" << sliceNumber <<  "slices.size()" << m_frame.slices.size();

//    if (sliceNumber == 0) { //情况一 处理【1】如果遇到丢分片情况下，再次遇到0片号的分片，直接清除残破图片并重新开始组帧
//        if(m_frame.slices.size() > 100 && m_frame.slices.size() < 300) {
//            qDebug() << "清除slices";
//            m_frame.slices.clear();
//        } else if(m_frame.slices.size() >= 300 && m_frame.slices.size() != m_totalSlices) {  // 情况一 处理【2】如果遇到丢分片情况下，再次遇到0片号的分片，直接存储残破图片并重新开始组帧
//            QByteArray completeImageData;

//            for (quint16 i = 0; i < m_totalSlices; ++i) {
//                if(m_frame.slices.contains(i)) {
//                    completeImageData.append(m_frame.slices[i]);
//                }
//            }

//            //qDebug() << "一帧的size" << completeImageData.size() << "frame.size()" << m_frame.slices.size();

//            saveRawImage(completeImageData);

//            m_frame.slices.clear();
//        }
//    }

    if (sliceNumber == 0 && m_frame.slices.size() > 0) {
        m_frame.slices.clear();
    }

    // 存储当前切片数据
    m_frame.slices[sliceNumber] = imageSlice;

    // 情况二 如果没有丢片的情况下，检查是否已收到所有切片512
    if (m_frame.slices.size() == m_totalSlices) {
        // 按切片号顺序拼接所有图片数据
        QByteArray completeImageData;
        for (quint16 i = 0; i < m_totalSlices; ++i) {
            completeImageData.append(m_frame.slices[i]);
        }

        //qDebug() << "一帧的size" << completeImageData.size() << "frame.size()" << m_frame.slices.size();
        //77初级昆明、贴 发送组装完成信号
        //emit frameCompleted(completeImageData, 640, 512);
        saveRawImage(completeImageData);

        m_frame.slices.clear();
    }
}

bool SaveAirWV::saveRawImage(const QByteArray &imageData)
{
    if (!checkAndSwitchDisk()) {
        return false; // 所有磁盘不可用，直接返回
    }

    // 构造完整文件路径：磁盘路径/基础路径/相机名称/文件名
    QString currentDisk = m_diskPaths[m_currentDiskIndex];
    QString fullDir = QString("%1/%2/%3").arg(currentDisk).arg(m_fileSavePath).arg(m_videoName);
    QDir dir(fullDir);
    if(m_creatDir) {
        if (!dir.exists() && !dir.mkpath(".")) { // 确保目录存在
            qDebug() << "无法创建目录:" << fullDir;
            return false;
        }
        m_creatDir = false;
    }

    // 生成文件名（包含时间戳）
    m_fileStartTime = QDateTime::currentDateTime();
    QString fileName = QString("%1/%2_%3.raw")
            .arg(fullDir)
            .arg(m_desc)
            .arg(m_fileStartTime.toString("yyyy-MM-dd_hh-mm-ss-zzz"));

    m_file.setFileName(fileName);
    if (!m_file.open(QIODevice::WriteOnly)) {
        qDebug() << "无法创建文件:" << fileName << "错误:" << m_file.errorString();
        return false;
    }

    //写入raw
    m_file.write(imageData);
    m_file.close();
    return true;
}
